相信走到這裡,讀者應該有辦法依需求在 Tableau Desktop 中活用 TabPy。但還有一個部分有可能造成開發困難,就是不知道如何查看錯誤訊息的詳細資訊或者確認 Tableau Desktop 傳來的資料格式,也就無法根據這些資訊來修正程式碼或 TabPy 的使用方式,進而導致在除錯遇到困難。因此這篇文章會分享使用 TabPy 應該要知道的除錯技巧。
若在 Tableau Desktop 使用 TabPy 的過程中,遇到類似下圖的錯誤訊息是很正常的事,我們要學習的是如何知道問題詳細資訊,並且將問題排除
當我們看到錯誤訊息視窗的時候,可以切換至啟動 TabPy Server 的 cmd.exe
中查看 Log,Log 中記錄所有通訊的過程,當然也包含錯誤訊息。這裡僅擷取關鍵資訊來展示
[INFO] : function to evaluate=def _user_script(tabpy, _arg1):
return [x > 10000 for x in arg1]
[ERROR] : Responding with status=500, message="Error processing script", info="NameError : name 'arg1' is not defined"
[ERROR] : 500 POST /evaluate (::1) 3.99ms
這幾行 Log 告訴我們一個資訊,TabPy 要執行下方的程式,卻發現未定義的變數名稱 (name 'arg1' is not defined
)
def _user_script(tabpy, _arg1):
return [x > 10000 for x in arg1]
_user_script(tabpy, _arg1)
:第一個參數 tabpy
不是我們所關心的,因此可以從第二個參數開始看。這裡的參數 _arg1
是不是很眼熟?就是在 [Day24] Tableau 輕鬆學 - TabPy 使用方法 1 提到的,TabPy 預設會以 _arg#
變數名稱來存取資料,就是因為這裡的 _user_script
函式所定義,而我們在 Tableau Desktop 所寫的 Python 程式會變成 _user_script
的本體。到這裡,應該知道為什麼會出現錯誤訊息 name 'arg1' is not defined
了吧,因為在 _user_script
中資料的變數名稱為 _arg1
而不是 arg1
。
有的時候,我們會懷疑是不是因為 Tableau Desktop 傳輸到 TabPy 的資料格式與我們想像中的不同,進而造成錯誤的發生。因此,如何查看傳輸至 TabPy 的資料也是需要學習的技術,才能更確定問題發生的原因。
將 銷售額大於10000
運算函式修改為
SCRIPT_BOOL("print('Hello TabPy')
return [x > 10000 for x in _arg1]", SUM([Sales]))
同樣觀察 TabPy Server 的 Log,會發現單獨一行的 Hello TabPy
,這是因為 print('Hello TabPy')
這行的運行結果。也就是說,所有的 print
訊息都會被輸出到 Log 中
[INFO] : function to evaluate=def _user_script(tabpy, _arg1):
print('Hello TabPy')
return [x > 10000 for x in _arg1]
Hello TabPy
利用這樣的運作流程,我們可以將資料 print
在 Log 來查看
SCRIPT_BOOL("print(_arg1[:10])
return [x > 10000 for x in _arg1]", SUM([Sales]))
觀察 Log 後發現,其實 Tableau Desktop 不是我們想像中的一次傳遞所有銷售額資料,而是一次只傳送一筆資料來運算,且有幾筆就會傳幾次
...
...
...
[INFO] : function to evaluate=def _user_script(tabpy, _arg1):
print(_arg1[:10])
return [x > 10000 for x in _arg1]
[1270.53]
[INFO] : function to evaluate=def _user_script(tabpy, _arg1):
print(_arg1[:10])
return [x > 10000 for x in _arg1]
[1603.1360000000002]
知道如何 Debug 是程式開發的必經之路,使用 print
來 Debug 是最萬用也是最容易的,這之中最關鍵的是需要知道 print
輸出的位置,蒐集的資訊夠多之後便能有目標性的修正 Bug,最後順利在 Tableau Desktop 使用屬於自己的 Model。